Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links

Carga del Modelo 3D

En este ejemplo voy a describir la estructura del archivo que utilizo para cargar el modelo 3D. Este archivo es una version simplificada de los archivos .asc, exportados por 3DStudio.

Formato del Archivo

El formato que voy a utilizar es muy simple, en la primer linea indico el numero de vertices que tiene el modelo:

Vertices: 6

despues estan los valores de las coordenadas X, Y, Z de cada uno de los vertices, se encuentran separados por un espacio, en mi ejemplo estan indexados del 0 al 5, ya que tengo 6 vertices:

0.0 10.0 0.0		0
-5.0 0.0 5.0		1
5.0 0.0 5.0		2
5.0 0.0 -5.0		3
-5.0 0.0 -5.0		4
0.0 0.0 0.0		5

la siguiente linea me indica el numero de poligonos o caras que tiene el modelo:

Faces: 8

cada poligono esta formado por 3 vertices, yo solo indico el indice del vertice correspondiente, el material que tiene aplicado, y luego a que grupo de suavizado pertenece:

0 1 2		indice de los vertices que forman esta cara
MaterialID: 0	este valor me indica que material tiene aplicado
Smoothing: 2	el grupo de suavisado al que pertenece

lo anterior es solo para la primer cara del modelo 3D, la del frente que esta en color verde en la imagen, las restantes se definen de igual manera, el modelo tiene 3 materiales (colores), diferentes y 3 grupos de suavizado.

las caras 0, 2 tiene aplicado el material con indice 0, y el grupo de smooth 2
las caras 1, 3 tienen el material con indice 1, y el grupo de smooth 1
las carss 4,5,6,7 tiene el material con indice 2, y el grupo de smooth 3

piramide_wire.jpg

Uuicación del modelo 3D en el espacio

este es el archivo completo piramide.dat

Vertices: 6
0.0 10.0 0.0
-5.0 0.0 5.0
5.0 0.0 5.0
5.0 0.0 -5.0
-5.0 0.0 -5.0
0.0 0.0 0.0
Faces: 8
0 1 2
MaterialID: 0
Smoothing: 2
0 2 3
MaterialID: 1
Smoothing: 1
0 3 4
MaterialID: 0
Smoothing: 2
0 4 1
MaterialID: 1
Smoothing: 1
1 5 2
MaterialID: 2
Smoothing: 3
2 5 3
MaterialID: 2
Smoothing: 3
3 5 4
MaterialID: 2
Smoothing: 3
4 5 1
MaterialID: 2
Smoothing: 3

Dos vista del modelo

piramide_smooth_1.jpg piramide_smooth_2.jpg

Ejecutable y Codigo Fuente

Rutina que se encarga de abrir, leer y almacenar todos los datos del modelo 3D en la estructura de datos que utilizo para representarlo.

El codigo fuente y el archivo del modelo y el material : ejemplo2.zip
el ejecutable : ejemplo4exe.zip


void CargarModelo(char *filename, Object3D &object)
{
 FILE  *file;
 char  *tempString = new char [80];
 char  trash[15];
 float tempX, tempY, tempZ;
 int   tempA, tempB, tempC;
 int   indexMaterial, indexSmoothing;
 int   i;
 
 if((file = fopen(filename, "rt"))==NULL)
	{
	printf("File Not Found : %s\n",filename);
	exit(1);
	}
 while(strncmp(tempString, "Vertices",8))
	{
	fscanf(file, "%s", tempString);
	if (feof(file))
		{
		printf("String \"Vertices\" no existe\n");
		exit(1);
		}
	}
 fgetc(file);				
 fscanf(file, "%d", &object.nVertices);
 object.pVertices = new Point3f[object.nVertices];
 for (i=0; i<object.nVertices; i++)
	{
 	fscanf(file, "%f %f %f\n", &tempX, &tempY, &tempZ);
	object.pVertices[i].x=tempX;
	object.pVertices[i].y=tempY;
	object.pVertices[i].z=tempZ;
	}
 while(strncmp(tempString, "Faces",5))
	{
	fscanf(file, "%s", tempString);
	if (feof(file))
		{
		printf("String \"Faces\" no existe\n");
		exit(1);
		}
	}
 fgetc(file);				
 fscanf(file, "%d", &object.nFaces);
 object.pFaces = new Face[object.nFaces];
 for (i=0; i<object.nFaces; i++)
	{
 	fscanf(file, "%d %d %d\n", &tempA, &tempB, &tempC);
	fscanf(file, "%s %d\n", &trash, &indexMaterial);
	fscanf(file, "%s %d\n", &trash, &indexSmoothing);
	object.pFaces[i].vertexIndices[0]=tempA;
	object.pFaces[i].vertexIndices[1]=tempB;
	object.pFaces[i].vertexIndices[2]=tempC;
	object.pFaces[i].material=indexMaterial;
	object.pFaces[i].smoothingGroup=indexSmoothing;
	}
}


valcoey@hotmail.com

Ramiro Alcocer, 2001

Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links